// userctx, 用户上下文
package userctx

import (
	"context"
	"golang.org/x/text/language"
)

// 当前调用人.
type UserCtx struct {
	Username string       // 用户名
	Language language.Tag // 当前用户语言环境
	FromIp   string       // 调用的ip地址
}

type key int

var userKey key

// NewContext returns a new Context that carries value u.
func NewContext(ctx context.Context, u *UserCtx) context.Context {
	return context.WithValue(ctx, userKey, u)
}

// FromContext returns the User value stored in ctx, if any.
func FromContext(ctx context.Context) (*UserCtx, bool) {
	u, ok := ctx.Value(userKey).(*UserCtx)
	return u, ok
}

func FromOrDefault(ctx context.Context) *UserCtx {
	u, ok := ctx.Value(userKey).(*UserCtx)
	if ok {
		if u.Username == "" {
			u.Username = "system"
		}
		return u
	} else {
		return &UserCtx{
			"system",
			language.SimplifiedChinese,
			"",
		}
	}
}
